From b98caf938594504508dfc4546d6f606e6edeab9d Mon Sep 17 00:00:00 2001 From: Bastien Nocera Date: Mon, 31 Jan 2011 00:30:00 +0000 Subject: [PATCH] GtkCssProvider: Take into account variant When loading a theme, make sure we take into account the variant so we don't use the plain version when the theme changes. Also make sure to fallback to the plain theme when loading a variant fails. https://bugzilla.gnome.org/show_bug.cgi?id=640983 --- gtk/gtkcssprovider.c | 31 +++++++++++++++++++++---------- gtk/gtksettings.c | 12 +++++++----- 2 files changed, 28 insertions(+), 15 deletions(-) diff --git a/gtk/gtkcssprovider.c b/gtk/gtkcssprovider.c index 61972f91f7..45324fc9fc 100644 --- a/gtk/gtkcssprovider.c +++ b/gtk/gtkcssprovider.c @@ -4003,24 +4003,31 @@ _gtk_css_provider_get_theme_dir (void) /** * gtk_css_provider_get_named: * @name: A theme name - * @variant: variant to load, for example, "dark", or %NULL for the default + * @variant: (allow-none): variant to load, for example, "dark", or + * %NULL for the default * * Loads a theme from the usual theme paths * * Returns: (transfer none): a #GtkCssProvider with the theme loaded. - * This memory is owned by GTK+, and you must not free it. - **/ + * This memory is owned by GTK+, and you must not free it. + */ GtkCssProvider * gtk_css_provider_get_named (const gchar *name, const gchar *variant) { static GHashTable *themes = NULL; GtkCssProvider *provider; + gchar *key; if (G_UNLIKELY (!themes)) themes = g_hash_table_new (g_str_hash, g_str_equal); - provider = g_hash_table_lookup (themes, name); + if (variant == NULL) + key = (gchar *)name; + else + key = g_strconcat (name, "-", variant, NULL); + + provider = g_hash_table_lookup (themes, key); if (!provider) { @@ -4048,7 +4055,9 @@ gtk_css_provider_get_named (const gchar *name, if (!path) { - gchar *theme_dir = _gtk_css_provider_get_theme_dir (); + gchar *theme_dir; + + theme_dir = _gtk_css_provider_get_theme_dir (); path = g_build_filename (theme_dir, name, subpath, NULL); g_free (theme_dir); @@ -4063,12 +4072,11 @@ gtk_css_provider_get_named (const gchar *name, if (path) { - GError *error = NULL; + GError *error; provider = gtk_css_provider_new (); - gtk_css_provider_load_from_path (provider, path, &error); - - if (error) + error = NULL; + if (!gtk_css_provider_load_from_path (provider, path, &error)) { g_warning ("Could not load named theme \"%s\": %s", name, error->message); g_error_free (error); @@ -4077,9 +4085,12 @@ gtk_css_provider_get_named (const gchar *name, provider = NULL; } else - g_hash_table_insert (themes, g_strdup (name), provider); + g_hash_table_insert (themes, g_strdup (key), provider); } } + if (key != name) + g_free (key); + return provider; } diff --git a/gtk/gtksettings.c b/gtk/gtksettings.c index 5008f09097..ee9c3361ab 100644 --- a/gtk/gtksettings.c +++ b/gtk/gtksettings.c @@ -2672,7 +2672,8 @@ settings_update_theme (GtkSettings *settings) static GQuark quark_theme_name = 0; GtkSettingsPrivate *priv = settings->priv; - GtkCssProvider *provider, *new_provider = NULL; + GtkCssProvider *provider; + GtkCssProvider *new_provider; gboolean prefer_dark_theme; gchar *theme_name; @@ -2686,14 +2687,15 @@ settings_update_theme (GtkSettings *settings) "gtk-application-prefer-dark-theme", &prefer_dark_theme, NULL); + new_provider = NULL; + if (theme_name && *theme_name) { - gchar *variant = NULL; - if (prefer_dark_theme) - variant = "dark"; + new_provider = gtk_css_provider_get_named (theme_name, "dark"); - new_provider = gtk_css_provider_get_named (theme_name, variant); + if (!new_provider) + new_provider = gtk_css_provider_get_named (theme_name, NULL); } if (new_provider != provider) -- 2.30.2